package ar.edu.utn.frba.disenio.arena.controllers;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.uqbar.arena.windows.Window;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import ar.edu.utn.frba.disenio.Asiento;
import ar.edu.utn.frba.disenio.Busqueda;
import ar.edu.utn.frba.disenio.DateParser;
import ar.edu.utn.frba.disenio.Usuario;
import ar.edu.utn.frba.disenio.Vuelo;
import ar.edu.utn.frba.disenio.arena.AterrizarApplication;
import ar.edu.utn.frba.disenio.arena.ErrorWindow;
import ar.edu.utn.frba.disenio.arena.OkWindow;
import ar.edu.utn.frba.disenio.arena.SobreReservaWindow;
import ar.edu.utn.frba.disenio.exceptions.ReservaExistenteException;

@Observable
public class BuscadorAsiento
{

	private Window<BuscadorAsiento> window;
	private String origen;
	private String destino;
	private String fechaSalida;
	private List<Asiento> resultados;
	private Asiento asientoSeleccionado;
	
	// ********************************************************
	// ** Acciones
	// ********************************************************
	
	public void buscarAsientos()
	{
		this.validarObligatorios();
		
		Usuario usuario = AterrizarApplication.getUsuarioLogueado();
		
		Busqueda busqueda = new Busqueda(origen, destino, DateParser.parseaFlexiblemente(fechaSalida), usuario, false, null);
		Collection<Vuelo> vuelos = usuario.buscarVuelos(busqueda);
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		for(Vuelo vuelo : vuelos)
		{
			asientos.addAll(vuelo.getAsientos());
		}
		
		this.resultados = asientos;
	}
	
	public void validarObligatorios()
	{
		if(origen == null || origen.trim().equals("") )
		{
			throw new UserException("Debe ingresar el origen.");
		}
		if(destino == null || destino.trim().equals("") )
		{
			throw new UserException("Debe ingresar el destino.");
		}
		if(fechaSalida == null || fechaSalida.trim().equals("") )
		{
			throw new UserException("Debe ingresar la fecha.");
		}
	}

	public void limpiar()
	{
		this.origen = "";
		this.destino = "";
		this.fechaSalida = "";
		this.resultados = null;
	}
	
	public void comprarAsiento()
	{
		try 
		{
			Usuario usuario = AterrizarApplication.getUsuarioLogueado();
			
			Vuelo vuelo = new Vuelo();
			vuelo.addAsiento(asientoSeleccionado);
			
			usuario.comprarVuelo(vuelo);
			
			new OkWindow(this.window, 
					"El asiento " + this.asientoSeleccionado.getCodigo() + 
					" ha sido comprado exitosamente.")
			.open();
			
			this.buscarAsientos();
		} 
		catch (UserException ex) 
		{
			new ErrorWindow(this.window, "comprar un asiento", ex.getMessage())
			.open();
		}
		

	}
	
	public void reservarAsiento()
	{
		try 
		{
			Usuario usuario = AterrizarApplication.getUsuarioLogueado();
			
			Vuelo vuelo = new Vuelo();
			vuelo.addAsiento(asientoSeleccionado);
			
			usuario.reservarVuelo(vuelo);
			
			new OkWindow(this.window, 
					"El asiento " + this.asientoSeleccionado.getCodigo() + 
					" ha sido reservado exitosamente.")
			.open();
			
			this.buscarAsientos();
		}
		catch (ReservaExistenteException ex)
		{
			new SobreReservaWindow(this.window, this.asientoSeleccionado)
			.open();
		}
		catch (UserException ex) 
		{
			new ErrorWindow(this.window, "reservar un asiento", ex.getMessage())
			.open();
		}
	} 

	// ********************************************************
	// ** Accessors
	// ********************************************************
	
	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public List<Asiento> getResultados() {
		return resultados;
	}

	public void setResultados(List<Asiento> resultados) {
		this.resultados = resultados;
	}

	public Asiento getAsientoSeleccionado() {
		return asientoSeleccionado;
	}

	public void setAsientoSeleccionado(Asiento asientoSeleccionado) {
		this.asientoSeleccionado = asientoSeleccionado;
	}

	public String getFechaSalida() {
		return fechaSalida;
	}

	public void setFechaSalida(String fechaSalida) {
		this.fechaSalida = fechaSalida;
	}

	public Window<BuscadorAsiento> getWindow() {
		return window;
	}

	public void setWindow(Window<BuscadorAsiento> window) {
		this.window = window;
	}

}
